﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace FFS.DBUtility
{
    public sealed class DBHelper
    {
        //读取配置文件
        private static readonly string connString = ConfigurationManager.ConnectionStrings["DBCONN"].ConnectionString;

        #region 预处理方法，供下面的方法调用。因为只在内部调用所以安全起见，用Private来修饰
        /// <summary>
        /// 预处理方法，供下面的方法调用。因为只在内部调用所以安全起见，用Private来修饰
        /// </summary>
        private static void PrepareCommand(
            SqlConnection conn,
            SqlCommand cmd,
            SqlTransaction trans,
            CommandType cmdType,
            string cmdText,
            SqlParameter[] Params)
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }

            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;

            if (trans != null)
            {
                cmd.Transaction = trans;
            }

            if (Params != null)
            {
                foreach (SqlParameter p in Params)
                {
                    if (p != null)
                    {
                        cmd.Parameters.Add(p);
                    }

                }
            }
        }
        #endregion

        #region 供业务逻辑层里面的增、删、改操作调用
        /// <summary>
        /// 供业务逻辑层里面的增、删、改操作调用，不返回操作结果，因要在外部调用故用Public来修饰
        /// </summary>
        public static int ExecuteNonQuery(
            CommandType type,
            string comText,
            params SqlParameter[] Params)
        {
            int returnLine = 0;
            SqlConnection conn = new SqlConnection(connString);

            SqlCommand cmd = new SqlCommand();

            PrepareCommand(conn, cmd, null, type, comText, Params);
            returnLine = cmd.ExecuteNonQuery();//执行SQL语句并返回受影响的行数
            cmd.Parameters.Clear();//清空参数列表中的参数值，否则参数会越积累越多

            return returnLine;



            //using (SqlConnection conn = new SqlConnection(connString))
            //{
            //    using (SqlCommand cmd = new SqlCommand())
            //    {
            //        try
            //        {
            //            PrepareCommand(conn, cmd, null, CommandType.Text, comText, parame);
            //            cmd.ExecuteNonQuery();//执行SQL语句并返回受影响的行数
            //            cmd.Parameters.Clear();//清空参数列表中的参数值，否则参数会越积累越多
            //        }
            //        catch
            //        {

            //            throw;
            //        }
            //        finally
            //        {
            //            conn.Close();
            //            cmd.Dispose();//释放SqlCommand对象占用的资源
            //        }
            //    }
            //}
        }
        #endregion

        #region 供业务逻辑层查询的方法调用
        ///<summary>
        /// 供业务逻辑层查询的方法调用，返回一个dataReader
        /// 
        /// 注意：在用dataReader读取数据库中的数据时，数据库必须一直保持打开状态。不能关闭，
        ///       否则会提示“阅读器在关闭时出错”。DataSet可以在关闭数据库的情况下对数据进行操作。
        /// </summary>
        public static SqlDataReader ExecuteReader(CommandType type,string comText,params SqlParameter[] parame)
        {
            SqlDataReader reader = null;
            SqlConnection conn = new SqlConnection(connString);

            SqlCommand cmd = new SqlCommand();

            //try
            //{
            PrepareCommand(conn, cmd, null, type, comText, parame);
                reader = cmd.ExecuteReader();
                cmd.Parameters.Clear();
           // }
            //catch
            //{
            //    throw;
           // }

            return reader;
        }
        #endregion

        #region 判断记录是否存在
        /// <summary>
        /// 返回首行首列，添加一条记录前在数据库中查询该项记录是否存在（或用于在数据中查询最大编号）
        /// </summary>
        public static object ExecuteScalar(
            CommandType type,
            string comText,
            params SqlParameter[] parame)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                object obj = null;
                using (SqlCommand cmd = new SqlCommand())
                {
                    try
                    {
                        PrepareCommand(conn, cmd, null, type, comText, parame);
                        obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                    }
                    catch
                    {
                        return null;
                    }
                    finally
                    {
                        conn.Close();
                        cmd.Dispose();
                    }
                }

                return obj;
            }
        }
        #endregion
    }
}
